1.6.1 Что такое Mesh?

Mesh - это набор четырехугольников и треугольников, который образует поверхность или твердое тело. В этой секции обсуждается структура объекта Mesh, которая включает вершины, ребра и поверхности, а также дополнительные характеристики mesh, такие как цвет и нормали.

IMAGE

  1. Вершины Mesh
  2. Ребра Mesh
  3. Поверхности Mesh

1.6.1.1 Основное строение Mesh

Grasshopper определяет mesh, используя структуру данных Face-Vertex. На самом примитивном уровне, это структура представляет собой набор точек, которые группируются в полигоны. Точки mesh называются vertices (вершины), а полигоны - faces. Чтобы создать mesh, нам требуется список вершин и система группирования этих вершин в полигоны.

IMAGE

  1. Список вершин.
  2. Полигоны с группами вершин

Вершины

Вершины mesh - это просто список точек. Напомним, что список Grasshopper - это набор объектов. Каждый объект в списке, имеет индекс, который описывает положение объектов в списке. Индекс вершины имеет большую важность при создании mesh, при получении информации о структуре mesh.

IMAGE

  1. Список точек. Все списки в Grasshopper начинаются с индекса ноль
  2. Набор точек со своими индексами

Полигоны

Face - это структурированный список из трех-четырех вершин. "Поверхностное" представление поверхности mesh означает в соответствии с положением вершины и ее индексом. У нас уже есть список вершин, которые составляют mesh, поэтому, вместо предоставления отдельных точек для определения face, мы просто используем индекс вершин. Это также позволяет нам использовать одну и ту же вершину в более чем одном полигоне.

IMAGE

  1. Четырехугольный полигон состоит из индексов 0, 1, 2 и 3
  2. Треугольный полигон состоит из индексов 1, 4 и 2

В Grasshopper face могут создаваться компонентами Mesh Triangle и Mesh QuadВводные параметры для этих компонентов - целые числа, которые соответствуют индексу вершин, которые мы хотим использовать для создания полигона. Соединяя Panel с выходом этих компонентов, мы можем увидеть, что треугольный полигон представлен как T{A;B;C} и четырехугольный полигон как Q{A;B;C;D}. Полигон с более чем 4 сторонами не допускаются. Чтобы создать 5-сторонний элемент mesh, mesh должна быть разбита на два или более полигона.

IMAGE

  1. Компонент Mesh Quad с индексами 0, 1, 2 и 3
  2. Компонент Mesh Triangle с индексами 1, 4 и 2

Важно помнить, что эти компоненты не создают геометрию mesh, также как и выход - это список индексов, которые определяют, как mesh должна создаваться. Уделяя внимание формату этого списка, мы также можем создать полигон вручную путем редактирования компонента Panel вводя подходящий формат для треугольных либо четырехугольных полигонов.

IMAGE

  1. Полигон, созданный с использованием компонента Mesh Quad
  2. Полигон, созданный с использованием Panel
  3. Окно характеристик Panel автоматически открывается при двойном клике по панели при масштабировании или при правом клике по панели и выборе "Edit Notes..."

На данный момент у нас есть список вершин и набор файлов полигонов, но мы все еще не создали mesh. Чтобы создать mesh, нам нужно соединить полигон и вершины используя компонент Construct Mesh Мы подключаем наш список вершин к входу V и смешанный список полигонов к входу F. (У компонента также есть дополнительный вход для цвета, мы обсудим это позже.) Если мы подключим panel к выходу Construct Mesh мы сможем увидеть информацию о числе полигонов и числе индексов.

IMAGE

  1. Компонент Construct Mesh берет список вершин и список полигонов как вводные данные. Вход Color опциональный, оставляется пустым пока что
  2. Panel показывает, что мы создали mesh с 5 вершинами и 2 полигонами
  3. Итоговая mesh (вершины были пронумерованы по их индексам)

По умолчанию, Grasshopper не показывает ребра геометрии mesh. Чтобы предварительно посмотреть на ребра и на поверхности, вы можете включить предпросмотр ребер mesh, используя комбинацию Ctrl-M или пройдя в меню Display и выбрав "Preview Mesh Edges".

IMAGE

Очень важно обратить внимание на порядок индексов при создании полигона mesh. Полигон будет создаваться при соединении пронумерованных вершин по порядку, так что четырехугольные полигоны Q{0,1,2,3} и Q{1,0,2,3} очень отличаются, несмотря на то, что используют одни и те же четыре вершины. Неправильное упорядочивание вершин может вести к проблемам, таким как щели (отверстия), неоднородная геометрия mesh либо неориентируемая поверхность. Такая геометрия mesh обычно неправильно рендерится и ее невозможно отправить на 3D печать. Эти вопросы обсуждаются более подробно в разделе Understanding Topology.

IMAGE

  1. Четырехугольный полигон с индексами 0,1,2,3
  2. Четырехугольный полигон с индексами 0,3,1,2

1.6.1.2 Скрытые данные Mesh

В дополнение к полигонам и вершинам, есть и другая информация о mesh, которую мы хотим использовать. В mesh, основанной на Face-Vertex, такие данные как edges (ребра) и normals (нормали) рассчитываются непрямо, на основе данных полигона и вершин. Этот раздел описывает способы получение этой информации.

Ребра

Ребра это линии, соединяющие любые две последовательные вершины в полигоне. Заметьте, что некоторые ребра принадлежат к нескольким полигонам, в то время как другие ребра принадлежат только одному полигону. Число полигонов, к которым ребра принадлежат, называется valence (валентность) этого ребра.

Grasshopper группирует ребра в три категории, на основе валентности:

  1. E1 - 'Naked Edges' имеют валентность 1. Они состоят из внешней границы mesh.
  2. E2 - 'Interior Edges' имеют валентность 2.
  3. E3 - 'Non-Manifold Edges' имеют валентность 3 и выше. Mesh, которые содержат такие структуры, называются “Non-Manifold” (неоднородные) и обсуждаются в следующем разделе.

IMAGE

  1. Naked edge имеют валентность 1
  2. Interior edge имеют валентность 2
  3. Non-manifold edge имеют валентность 3

Мы можем использовать компонент Mesh Edges чтобы получить ребра mesh в соответствии с их валентностью. Это позволяет вам расположить ребра вдоль границы mesh или определить неоднородные ребра. Иногда, тем не менее, бывает более полезно иметь полное представление о граничных плоскостях каждого полигона. Для этого, мы можем использовать компонент Face Boundaries. Этот компонент извлекает полилинию для каждого полигона.

IMAGE

  1. Компонент Mesh Edges выдает три набора ребер. Этот mesh имеет 5 naked, 1 interior и ноль non-manifold ребер
  2. Выход E3 пустой, потому что у mesh нет non-manifold ребер, результатом чего становится оранжевая связь.
  3. Компонент Face Boundaries выдает одну полилинию для каждого face

Нормали Поверхности

Normal vector (нормальный вектор) это вектор с амплитудой, которая перпендикулярна поверхности. В случае треугольных полигонов, мы знаем, что любые три точки должны быть плоскими, тогда нормаль будет перпендикулярна к этой плоскости, но как нам узнать в каком направлении (вверх или вниз) будет указывать нормаль? И снова порядок индексов является решающим. Полигоны mesh в Grasshopper определяется против часовой стрелки, поэтому полигон с индексами {0,1,2} будет "перевернут" по сравнению с индексами {1,0,2}. Другой способ визуализации - использовать Right-Hand-Rule (Правило правой руки).

IMAGE

  1. Компонент Face Normals извлекает список точек начала координат и нормальных векторов для каждой face
  2. Нормали полигона в соответствии с последовательностью вершин
  3. "Правило правой руки" для определения направления нормали

Grasshopper также допускает четырехугольные полигоны, в которых 4 точки не всегда будут плоскими. Для таких полигонов, точка начала координат будет просто средним координат 4-х вершин (в случае не плоских четырехугольников, заметьте, что эта точка необязательно находится на mesh). Чтобы рассчитать нормаль четырехугольного полигона, нам необходимо сначала триангулировать четырехугольник разбив его на два плоских треугольника. Нормаль полного полигона, тогда становится, средним значение двух нормалей, взвешенных в соответствии с областью двух треугольников.

Нормали Вершины

В дополнение к нормалям полигонов, также возможно высчитать нормали каждой вершины mesh. Для вершины, которая используется только в одном полигоне, нормаль вершины будет указывать в том же направлении, что и нормаль полигона. Если у вершины имеются многочисленные смежные полигоны, то нормаль вершины рассчитывается через среднее всех полигонов.

Хотя этот расчет менее интуитивный, чем у нормали полигонов, нормали вершины важны для сглаженной визуализации mesh. Вы могли заметить, что даже когда mesh состоит из плоских полигонов, такая mesh может все равно выглядеть сглаженной и округлой при затенении в Rhino. Использование нормали вершины позволяет получить такую сглаженную визуализацию.

IMAGE

  1. Нормали, установленные в соответствии с нормалями полигонов, дают в итоге в дискретное полигональное затенение
  2. Смежные нормали полигонов усреднены вместе для создания нормали вершин, что приводит к сглаженному затенению полигона

1.6.1.3 Свойства Mesh

Mesh могут быть также приписаны дополнительные свойства либо вершин либо полигонов. Самое простое из этого - это цвет вершины, который описывается ниже, но существуют и другие свойства, такие как текстура UV координат. (Некоторые программы даже позволяют нормалям вершин быть назначенными как аттрибуты вместо того, чтобы быть извлеченным из полигона и вершин, которые могут предоставить даже больше адаптивности во внешнем виде отрендеренной поверхности.)

Цвет

При использовании компонента Construct Mesh существует дополнительный вход для цвета вершины. Цвета также могут быть приписаны существующей mesh используя компонент Mesh Color Используя один цвет для mesh, мы можем закрасить mesh полностью.

IMAGE

Треугольные объекты mesh раскрашенные красным, зеленым или голубым

В то время как вышеуказанные примеры закрашивали полностью mesh, цветовые данные обычно приписываются к каждой вершине. Используя список из трех цветов, мы может закрасить каждую вершину в треугольнике по отдельности. Эти цвета используются для визуализации, каждый полигон рендерится как интерполяция цветов вершин. Например, изображение ниже показывает треугольный полигон с цветами вершин красный, зеленый и голубой.

IMAGE

  1. Красный, зеленый и голубой цвета приписаны к трем вершинам mesh
  2. Итоговая mesh интерполирует цвета вершин

1.6.1.4 Упражнение

Файлы упражнения, которые сопровождают этот раздел: Download

01. Запустите новый файл набрав Ctrl-N (в Grasshopper)
02. Зайдите в Mesh/Primitive/Mesh Quad - перетащите компонент Mesh Quad на холст IMAGE
03. Зайдите в Mesh/Primitive/Construct Mesh - перетащите компонент Construct Mesh на холст IMAGE
04. Соедините выход Face (F) компонента Mesh Quad с входом Faces (F) компонента Construct Mesh

IMAGE

У Mesh Quad и Construct Mesh есть значения по умолчанию, которые создают один полигон у mesh. Затем, мы заменим значения по умолчанию нашими собственными значениями наших вершин и полигонов.

05. Зайдите в Params/Input/Panel - перетащите компонент Panel на холст
06. Дважды кликните по компоненту Panel и установите значение "0"
07. Зайдите в Params/Input/Panel - перетащите на холст еще четыре компонента Panel и установите их значения на 1,2,3, и 4

Вы также можете скопировать первую **Panel** кликните и зажмите клавишу, перетащите, затем нажмите на клавишу Alt перед тем как отпустить клавишу
08. Соедините Panels и с входами компонента Mesh Quad в следующем порядке:
    0 - A
    1 - B
    2 - C
    3 - D
09. Зайдите в Mesh/Primitive/Mesh Triangle - перетащите компонент Mesh Triangle на холст IMAGE
10. Соедините Panels с входами Mesh Triangleв следующем порядке:
    1 - A
    2 - B
    4 - C
11. Зайдите в Sets/Tree/Merge - вытащите компонент Merge на холст IMAGE
12. Соедините выход Face (F) компонента Mesh Quad с входом Data1 (D1) компонента Merge и выход Face (F)компонента Mesh Triangle с входом Data2 (D2) компонента Merge
13. Соедините выход Result (R) компонента Merge с входом Faces (F) компонента Construct Mesh

IMAGE

По умолчанию список Vertices (V) компонента Construct Mesh имеет только 4 точки, но наш компонент Mesh Triangleиспользует индекс 4, который будет соответствовать пятой точке в списке. Так как вершин недостаточно, компонент Construct Mesh выдает ошибку. Чтобы ее исправить, мы предоставим наш список точек.

14. Зайдите в Params/Input/Panel - вытащите компонент Panel на холст
15. Кликните правой клавишей мыши по компоненту Panel и снимите выделение с опции 'Multiline Data'

По умолчанию, у панели опция 'Multiline Data' включена. Отключая ее, каждая строчка с панели будет прочитываться как отдельный элемент внутри списка.
16. Дважды кликните по компоненту Panel для его редактирования, введите следующие точки:
    {0,0,0}
    {1,0,0}
    {1,1,0}
    {0,1,0}
    {2,0,0}
Убедитесь, что вы используете правильную систему чисел. Чтобы определить точку на **Panel**, вы должны использовать фигурные скобки: '{' и '}' с запятыми между значениями x, y и z
17. Соедините компонент Panel с входом Vertices (V) компонента Construct Mesh

IMAGE

У нас сейчас есть mesh с двумя полигонами и 5 вершинами.

На выбор, мы можем заменить компоненты Mesh Quad и Mesh Triangle Панелью, указав индексы полигонов.

18. Зайдите в Params/Input/Panel - вытащите компонент Panel на холст
19. Кликните правой клавишей мыши по компоненту Panel и снимите выделение с опции 'Multiline Data'

Либо скопируйте существующую **Panel**которую мы использовали для точек, у которых уже снято выделение с опции 'Multiline Data'
20. Дважды кликните по компоненту Panel для его редактирования, введите следующее:
    Q{0,1,2,3}
    T{1,2,4}
21. Соедините компонент Panel с входом Faces (F) компонента Construct Mesh

IMAGE

22. Зайдите в Params/Input/Colour Swatch - вытащите компонент Colour Swatch на холст IMAGE
23. Кликните по цветной секции компонента (по умолчанию указан белый цвет), чтобы открыть панель выбора цвета
24. Используйте слайдеры, чтобы установить значение G и B на ноль. Палитра должна стать красной
25. Зайдите в Params/Input/Colour Swatch - перетащите на холст еще два компонента Colour Swatch и настройте их цвета на Blue (голубой) и Green (зеленый)
26. Зайдите в Sets/Tree/Merge - вытащите компонент Merge на холст
27. Соедините три компонента Color Swatch с входами D1, D2, и D3 компонента Merge.
28. Соедините выход Result (R) компонента Merge с входом Colours (C)компонента Construct Mesh

IMAGE

У нас есть 5 вершин и только 3 цвета. Grasshopper назначит цвета в соответствии с повторяющимся паттерном, так что в этом случае вершины 0 и 3 будут красного цвета, вершины 1 и 4 будут зеленого цвета, а вершина 2 будет голубого цвета.